<?php
declare (strict_types = 1);
namespace app\common\model\content;

use app\common\utils\facade\FileUtil;
use think\Exception;
use think\Model;

/**
 * @mixin think\Model
 */
class Image extends Model
{
    //图片保存的永久目录
    const SAVE_PATH = 'image';
    const TMP_PATH = 'temporary';
    const FIELD_NAME = 'image';

    // 定义时间戳字段名
    protected $updateTime = false;

    // 设置字段信息
    protected $schema = [
        'id'            => 'int',
        'article_id'    => 'int',
        'image'         => 'string',
        'create_time'   => 'int'
    ];

    // 类型转换
    protected $type = [
        'id'            => 'integer',
        'article_id'    => 'integer',
    ];

    //关联图片
    public function article()
    {
        return $this->belongsTo(Article::class,'article_id', 'id');
    }

    /**
     * #删除图片记录之后记得删除物理图片
     * @param Model $model
     */
    public static function onAfterDelete(Model $model)
    {
        //这个image路径是url绝对路径 /1.jpg
        $real_file = config('filesystem.public.root') . $model->image;
        if(is_file($real_file))
            FileUtil::unlinkFile($real_file);

    }



    /**
     * #删除某篇文章的所有图片包括物理图片
     * @param $article_id
     */
    public static function deleteByArticle(int $article_id){
        //查询记录
        static::destroy(function($query)use($article_id){
            $query->where(['article_id'=>$article_id]);
        });
    }

    /**
     * 保存图片到数据库 并转换连接
     * @param array $images
     * @param int $article_id
     * @return array
     * @throws Exception
     */
    public static function moveImage(array $images, int $article_id){
        //查询数据库中的图片列表
        $db_images = Image::where(['article_id'=>$article_id])->column('image', 'id');

        //该删除的图片
        $del = array_diff($db_images, $images);
        if( $del ) static::destroy(array_keys($del));

        //该添加的
        $add = array_diff($images, $db_images);
        if ( !$add ) return [];

        return static::moveToForever($add);
    }

    /**
     * #转移临时图片到永久目录 并返回永久图片列表和临时图片列表
     * @param array $images
     * @return array
     * @throws Exception
     */
    private static function moveToForever(array $images){
        if (empty($images)) return [];


        $res = ['ori'=>[],'des' => []];
        foreach ($images as $k => $item){
            $res['ori'][$k] = $item;
            $res['des'][$k] = str_replace(static::TMP_PATH, static::SAVE_PATH, $item);
            //转移文件
            $ori_path = config('filesystem.public.root') . DS . ltrim($res['ori'][$k], '\\/');
            $des_path = config('filesystem.public.root') . DS . ltrim($res['des'][$k], '\\/');

            if( is_file($ori_path)   ){
                FileUtil::moveFile($ori_path, $des_path);
            }
        }
        return $res;
    }


    /**
     * #保存图片数据到数据库 返回新建数目
     * @param array $images
     * @param int $article_id
     * @return \think\Collection
     */
    public static function saveImage(array $images, int $article_id){
        $data = [];

        foreach ($images as $image){
            $data[] = [
                'article_id' => $article_id,
                'image'      => (string) $image
            ];
        }

        return (new static())->saveAll($data);
    }



}
